package com.github.rxyor.common.core.enums;

import com.github.rxyor.common.core.util.ReflectUtil;
import java.lang.reflect.Method;

/**
 *<p>
 *key value枚举
 *</p>
 *
 * @author liuyang
 * @date 2019/8/27 周二 16:20:00
 * @since 1.0.0
 */
public interface KvStringEnum {

    /**
     *code
     */
    String getCode();

    /**
     *描述
     */
    String getDesc();

    /**
     * 枚举名
     */
    String name();


    class KvEnumUtil {

        /**
         *根据枚举code获取枚举
         *
         * @author liuyang
         * @date 2019-08-27 周二 16:43:43
         * @param code code
         * @param t t
         * @return
         */
        public static <T extends KvStringEnum> T getEnumByCode(String code, Class<T> t) {
            if (code == null || t == null) {
                return null;
            }
            Method method = ReflectUtil.getNonParameterMethod(t, "values");
            T[] enums = (T[]) ReflectUtil.invokeNonParameterStaticMethod(method);
            if (enums == null) {
                return null;
            }
            for (T e : enums) {
                if (code.equals(e.getCode())) {
                    return e;
                }
            }
            return null;
        }

        /**
         *根据枚举name获取枚举
         *
         * @author liuyang
         * @date 2019-08-27 周二 16:44:23
         * @param name name
         * @param t t
         * @return
         */
        public static <T extends KvStringEnum> T getEnumByName(String name, Class<T> t) {
            if (name == null || t == null) {
                return null;
            }
            Method method = ReflectUtil.getNonParameterMethod(t, "values");
            T[] enums = (T[]) ReflectUtil.invokeNonParameterStaticMethod(method);
            if (enums == null) {
                return null;
            }
            for (T e : enums) {
                if (name.equals(e.name())) {
                    return e;
                }
            }
            return null;
        }
    }
}
